#ifndef FCCU_QUEUE_H
#define FCCU_QUEUE_H

#include <stdint.h>
#include <stdbool.h>
#include "spsc_queue.h"

#define FCCU_QUEUE_LEVELS       (4U)    /* 队列优先级级数 */
#define FCCU_QUEUE_LEVEL_SIZE   (32U)   /* 每级队列容量（项数） */

/* 多级环形队列集合结构体
 * 用于支持不同优先级的故障事件分级存储。
 */
struct FCCU_QueueSet
{
    struct SpscQueue *queue[FCCU_QUEUE_LEVELS]; /* 各优先级队列指针数组 */
    uint8_t level_count;                        /* 队列级数 */
    uint32_t item_size;                         /* 每项大小（需为2的幂，兼容SpscQueue_Create） */
};

/**
 * @brief 初始化多级队列集合
 * @param set       队列集合指针
 * @param item_size 每项大小（字节）
 * @return 0成功，-1失败
 */
int32_t Fccu_QueueSetInit(struct FCCU_QueueSet *set, uint32_t item_size);

/**
 * @brief 销毁多级队列集合，释放资源
 * @param set 队列集合指针
 */
void Fccu_QueueSetDestroy(struct FCCU_QueueSet *set);

/**
 * @brief 向指定优先级队列推入一项
 * @param set   队列集合指针
 * @param level 优先级索引
 * @param data  数据指针
 * @return 0失败，>0成功（推入字节数）
 */
int32_t Fccu_QueueSetPush(struct FCCU_QueueSet *set, uint8_t level, const void *data);

/**
 * @brief 从集合中按优先级弹出一项
 * @param set       队列集合指针
 * @param data      存放弹出数据的缓冲区
 * @param out_level 输出弹出项的优先级索引（可为NULL）
 * @return 1成功，0失败（无数据）
 */
int32_t Fccu_QueueSetPop(struct FCCU_QueueSet *set, void *data, uint8_t *out_level);

/**
 * @brief 判断所有队列是否均为空
 * @param set 队列集合指针
 * @return true全空，false至少有一项
 */
bool Fccu_QueueSetIsEmpty(struct FCCU_QueueSet *set);

#endif /* FCCU_QUEUE_H */